home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
051-075
/
069
/
blitlab
/
blitlab.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
5KB
|
182 lines
/*
* This is the main routine from BlitLab.
*/
#include "structures.h"
/*
* Here are all the globals we use. (Yuck! Globals!)
*/
struct Window *mywindow ;
struct GfxBase *GfxBase ;
struct IntuitionBase *IntuitionBase ;
struct RastPort *myrp ;
char strings[900] ;
char *bufarr[MAXGADG] ;
long gvals[MAXGADG] ;
struct Gadget *gadgets[MAXGADG] ;
char errorbuf[140] ;
short *realbits ;
struct blitregs blitregs ;
int errortitle ;
/*
* Externals we use:
*/
extern int blitsafe() ;
/*
* Some statics to this module.
*/
static int updatethem ;
/*
* Errors go through here. Currently, we write to the CLI window.
* Later, we will write to the title bar of the window.
*/
error(s)
char *s ;
{
if (mywindow == NULL)
printf("blitlab: %s\n", s) ;
else {
SetWindowTitles(mywindow, s, -1L) ;
errortitle = 1 ;
}
if (*s == '!')
cleanup() ;
}
/*
* This routine handles a gadget selection.
*/
handlegadget(gp)
register struct Gadget *gp ;
{
static int gocount = 0 ;
if (errortitle == 1) {
SetWindowTitles(mywindow, BANNER, -1L) ;
errortitle = 0 ;
}
if (bufarr[gp->GadgetID] == NULL)
switch(gp->GadgetID) {
case GDGPNTREG:
case GDGCLRSET:
case GDGLINE:
case GDGDESC:
case GDGFCI:
case GDGIFE:
case GDGEFE:
case GDGUSEA:
case GDGUSEB:
case GDGUSEC:
case GDGUSED:
flipgadg(gp->GadgetID) ;
break ;
case GDGCALC:
parseall() ;
updatethem = 0 ;
if (!blitsafe()) {
error("Blit unsafe.") ;
}
break ;
case GDGSETUP:
setupline() ;
parseall() ;
break ;
case GDGGO:
gocount += 2 ;
parseall() ;
updatethem = 0 ;
if (!blitsafe()) {
if (gocount < 3)
error("Blit unsafe---hit again to override") ;
else {
doblit() ;
updatebits() ;
}
} else {
doblit() ;
updatebits() ;
}
break ;
default:
error("! bad value in gadget switch") ;
break ;
}
if (gocount > 0)
gocount-- ;
}
/*
* The main routine, no arguments. Sets things up, and then goes
* through the standard Intuition message loop.
*
* It may look like I'm setting message to NULL and checking it and
* everything all over, but that is so I can introduce interruptibility
* into some operations later, if I choose.
*/
main() {
struct IntuiMessage *message = NULL ;
int x, y ;
int mousemoved = 0 ;
int getouttahere = 0 ;
int selectdown = 0 ;
int bam ;
int ox, oy ;
initialize() ;
while (1) {
mousemoved = 0 ;
bam = 0 ;
if (message == NULL)
WaitPort(mywindow->UserPort) ;
while (message || (message =
(struct IntuiMessage *)GetMsg(mywindow->UserPort))) {
x = message->MouseX ;
y = message->MouseY ;
if (message->Class == MOUSEMOVE) {
ReplyMsg(message) ;
message = NULL ;
mousemoved = 1 ;
} else {
if (message->Class == MOUSEBUTTONS) {
selectdown = (message->Code == SELECTDOWN) ;
bam = 1 ;
} else if (message->Class == GADGETDOWN ||
message->Class == GADGETUP) {
updatethem = 1 ;
handlegadget((struct Gadget *)(message->IAddress)) ;
} else if (message->Class == CLOSEWINDOW) {
getouttahere = 1 ;
} else
error("! undefined message class") ;
ReplyMsg(message) ;
message = NULL ;
}
}
if (getouttahere)
break ;
if (updatethem) {
parseall() ;
updatethem = 0 ;
}
x = (x - HBITSTART) / 6 ;
y = (y - VBITSTART) / 3 ;
if (y < 32 && x < 96 && x >= 0 && y >= 0) {
if (gvals[GDGPNTREG]) {
if (bam) {
if (selectdown) {
ox = x ;
oy = y ;
} else {
preg(ox, oy, x, y, (int)gvals[GDGCLRSET]) ;
}
}
} else {
if (selectdown)
pdot(x, y, (int)gvals[GDGCLRSET]) ;
}
if (message != NULL || (message =
(struct IntuiMessage *)GetMsg(mywindow->UserPort))) ;
else
updatepos(x, y) ;
}
}
cleanup() ;
}